想量化人脸上的情绪?课代表工具都帮你准备好了
我们常说,语言会骗人,但表情和肢体动作是骗不了人的。那我们可能量化一个人的面部表情,来做分析吗?
答案是,可以的。
美国数据可视化公司 Periscopic(潜望镜)一个有趣的作品《One Angry Bird:Emotional arcs of the past ten U.S. presidential inaugural address》就是基于人脸识别的情绪分析创作的。
Periscopic 这个作品是就用数据验证了人们的直觉感受——特朗普确实与其他总统不同。他们对 1981 年里根到 2017年 特朗普共 10 届的美国总统就职演讲视频做了面部表情分析,发现奥巴马、布什父子、克林顿和里根都表现得比较积极或冷静,但特朗普就显得异常消极,用他们的话来说,像一只“愤怒的小鸟”。
这个作品用的数据分析方法说到底就是情感分析,只不过大家见得比较多的可能是做文本情感分析的作品。文本情感分析涉及自然语言处理(NLP),主要基于情感词典或机器学习或二者混合的方法工作。而图像情感分析,主要原理是提取人脸特征,并对这些特征进行情感分类,现在的分类训练主要基于深度学习方法。
听着很“高大上”,但我们也不必真的深入了解这些原理。即使我们不是算法工程师,也可以做人脸情绪分析。课代表就尝试了一下 Periscopic 数据说明里提及的 Microsoft Emotion API,复刻了一下特朗普的情绪数据。
✦✧
想分析人脸情绪?会用API就行!
这个API是支持在线使用的,如果你只需要识别少量图片,完全可以在网页上完成。进入到创建项目时选择区域的对应通道后,修改参数,输入图片以 jpg 结尾的url(网址),就可以获得数据,一共是生气、轻蔑、恶心、恐惧、伤心、开心、惊讶和中立8种情绪值。
⌂ 点击图片查看大图
好,到这里,恭喜你通关普通难度了,你已经掌握微软人脸情绪分析API的基本使用方法了,能够分析图片的人脸情绪了。但不要忘记,Periscopic 的项目是分析了多个视频,所以课代表还是要带大家走一下困难关卡:写代码调用API,分析视频中人物的情绪变化。
Microsoft Azure Cognitive Services 其实是给了相关代码的,但这是用 C# 写的,也更强调对实时监控视频的分析。会 C# 的大神朋友可以直接访问他们的Github 借用代码,而不会 C# 的课代表决定根据原理,用更大众的 python 来复刻。
https://github.com/microsoft/Cognitive-Samples-VideoFrameAnalysis
#跳过思路版#
以下教程涉及到的代码,课代表都上传 Github 啦。不会写代码,不想深入了解代码的朋友可以直接借用,找到 “ 需要修改的地方x ” 这样的注释,按照指示修改几处内容就好啦。
如果你还想了解一下,复刻思路,可以继续往下看:
#分析思路版#
第一步:下载好需要分析的视频
第二步:视频抽帧和裁剪视频。
这一步的核心思想其实是把视频变为图片。众所周知,视频其实就是由一帧一帧图片构成的,所以只要我们在合理的间隔抽取一帧图片来分析,就能够较有代表性地分析视频啦。(当然,如果足够有钱和有时间的话,每一帧分析也可以……)
那到底怎么确定抽取间隔呢?参考 Periscopic 的相关创作手札,隔半秒抽取一帧是可行的,毕竟一秒内人的表情相对稳定,一秒两帧已有相当的代表性。那么我们就需要计算视频的总帧数,进而计算每秒多少帧,来确定“每隔x秒抽取一帧”的x是多少。最后写一个循环来抽帧就大功告成。
⌂ 抽帧代码截图
当然,在抽帧前后,还有一些细节需要处理。需要根据人物固定所在的位置收窄一下画幅,这通过代码可以批量处理。但还需要检查一下漏网之鱼,用 PS 手动给某些帧里的多余面孔打码。
⌂ 裁剪代码截图
第三步:调用API批量分析并导出。
正式调用 API 之前,记得把所有图片上传到可以产生 jpg 或 png 结尾的 url 的在线网站,例如 Github,并以同样格式序列命名,这样之后才能调用成功。
用 python 调用 API 做的工作,其实和在网页做的工作是一样的,总结来说,还是要选择通道、确定参数和输入密钥。只是后面需要写一个循环,让代码自动读取图片,以做到批量生产。
⌂ python代码调用API截图
⌂ 批量分析代码截图
这些分析结果是json格式的,为了后续分析方便,需要转为csv格式。
第四步:分析数据和可视化
初次得到csv文件后,打开发现,正如 Periscopic 所说,大多数画面都是中立(neutral)情感为主。所以要考虑保留次要情绪,这样才能明显地看出积极和消极倾向。为了看出主要趋势,课代表简单粗暴地删除了“中立”项来可视化(Periscopic 是保留了的)。
⌂ excel处理情绪值截图
同样,为了简单直观地可视化这个最终的分析结果,课代表没有用 Periscopic用的编程语言 Processing,而是使用了零代码需求的在线可视化工具 Flourish 来制作。虽然简陋,但能看出和 Periscopic 的成品结果是相似的。课代表宣布复刻事业大成功!✌️人脸情绪分析这项技能成功点亮!✨
不止微软提供人脸情绪识别的API,其实在国内,旷视和百度也提供相应的API。课代表也做了相应的测试:
旷视的API含七个情绪指标,比微软少了一个“轻蔑(contempt)”,测试结果和微软稍有出入,但依然以消极情绪为主,整体吻合。
⌂ 旷视API测试结果
而百度的API则稍逊一筹,尽管百度包含九个情绪指标(愤怒、厌恶、恐惧、高兴、伤心、惊讶、嘟嘴、鬼脸、无情绪),但 API 只会返回第一位情绪值,还时常出现“无法识别”情况,“嘟嘴”“鬼脸”这两个指标也难以解读。
⌂ 百度API测试结果
✧✦
情感分析,yyds?
做完复刻,是不是觉得情感分析是一个很厉害的方法,开启了新世界大门?课代表很能理解这样激动的心情,毕竟我们就是希望机器能帮我们客观地呈现、分析更多缥缈的东西。
我们希望机器能帮我们化繁为简,“把书读薄”,所以让它们做一些高频词统计工作;我们希望机器能帮我们捕捉情绪,了解好恶,所以让它们做一些情感分析工作。
但愿景虽好,目前技术还是有很大提升空间的。不了解情感分析的局限性,滥用情感分析,很容易生产出不科学的结论。
比如,大家常用的一个文本情感分析 python 工具包 snowNLP ,也有不少“失灵”的时候。snowNLP Github 上的官方源码仓库问题区里就有不少表示“不准”的帖子:
⌂ Github上的问题帖子截图
说实话,想要一个模板走天下是不切实际的,所以使用前需要使用新数据集对程序进行训练,源码仓库里也提供了训练文件。但现实是,很多使用者不进行训练就使用 python 包,这会产生很多虚假的结论;而更可怕的是,读者并不清楚后台的处理过程,很容易轻信这些虚假结论。这会极大损伤新闻的真实性和准确性。
回到我们复刻项目看,它也不是尽善尽美的。Periscopic 做这个项目的时候,也在末尾写了很长的数据说明,也交代了准确性问题——通过和真实感受比对,确认 API 大体上能反映正确情绪,但也可能对讽刺、自鸣得意等复杂情绪产生误读。而课代表对旷视和百度 API 的测试结果有好有坏,可见同一个分析方法,不同平台的技术支持能力也是有差异的。
所以,我们使用情绪分析时,需要谨慎再谨慎,需要充分检验工具的能力、核查结论的可靠性,这样才能交出“真答案”。
我们无法苛求机器尽善尽美,只能在使用时再三确认,毕竟情感是人独特的存在,正是因为有很多机器“终其一生”都难以参透的微妙之处,才显得弥足珍贵。
公众号后台回复 64,可以获取本文所有编程文件及本文高清大图,跟着课代表一起学习!
作者 邓海滢
◒◡◒
┊推 - 荐 - 阅 - 读┊